package com.zenithmind.exam.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.exam.pojo.dto.ExamCreateDTO;
import com.zenithmind.exam.pojo.entity.Exam;
import com.zenithmind.exam.pojo.vo.ExamVO;
import com.zenithmind.exam.pojo.vo.QuestionVO;

import java.util.List;

/**
 * 考试服务接口
 * 
 * @author ZenithMind
 * @since 2024-07-01
 */
public interface ExamService extends IService<Exam> {

    /**
     * 创建考试
     * 
     * @param examCreateDTO 考试创建DTO
     * @return 创建结果
     */
    boolean createExam(ExamCreateDTO examCreateDTO);

    /**
     * 更新考试
     * 
     * @param examId 考试ID
     * @param examCreateDTO 考试更新DTO
     * @return 更新结果
     */
    boolean updateExam(String examId, ExamCreateDTO examCreateDTO);

    /**
     * 删除考试
     * 
     * @param examId 考试ID
     * @return 删除结果
     */
    boolean deleteExam(String examId);

    /**
     * 根据ID获取考试
     * 
     * @param examId 考试ID
     * @return 考试信息
     */
    ExamVO getExamById(String examId);

    /**
     * 分页查询考试列表
     * 
     * @param page 分页参数
     * @param title 考试标题
     * @param categoryId 分类ID
     * @param creatorId 创建者ID
     * @param type 考试类型
     * @param status 状态
     * @return 分页结果
     */
    IPage<ExamVO> getExamPage(Page<Exam> page, String title, String categoryId, 
                             String creatorId, Integer type, Integer status);

    /**
     * 发布考试
     * 
     * @param examId 考试ID
     * @return 发布结果
     */
    boolean publishExam(String examId);

    /**
     * 暂停考试
     * 
     * @param examId 考试ID
     * @return 暂停结果
     */
    boolean pauseExam(String examId);

    /**
     * 恢复考试
     * 
     * @param examId 考试ID
     * @return 恢复结果
     */
    boolean resumeExam(String examId);

    /**
     * 结束考试
     * 
     * @param examId 考试ID
     * @return 结束结果
     */
    boolean endExam(String examId);

    /**
     * 获取考试题目列表
     * 
     * @param examId 考试ID
     * @param userId 用户ID
     * @param showAnswer 是否显示答案
     * @return 题目列表
     */
    List<QuestionVO> getExamQuestions(String examId, String userId, boolean showAnswer);

    /**
     * 开始考试
     * 
     * @param examId 考试ID
     * @param userId 用户ID
     * @return 考试记录ID
     */
    String startExam(String examId, String userId);

    /**
     * 检查用户是否可以参加考试
     * 
     * @param examId 考试ID
     * @param userId 用户ID
     * @return 检查结果
     */
    boolean canUserTakeExam(String examId, String userId);

    /**
     * 获取进行中的考试列表
     * 
     * @return 进行中的考试列表
     */
    List<ExamVO> getOngoingExams();

    /**
     * 获取即将开始的考试列表
     * 
     * @return 即将开始的考试列表
     */
    List<ExamVO> getUpcomingExams();

    /**
     * 获取热门考试列表
     * 
     * @param limit 限制数量
     * @return 热门考试列表
     */
    List<ExamVO> getHotExams(Integer limit);

    /**
     * 复制考试
     * 
     * @param examId 考试ID
     * @param newTitle 新标题
     * @return 复制结果
     */
    boolean copyExam(String examId, String newTitle);

    /**
     * 更新考试统计信息
     * 
     * @param examId 考试ID
     */
    void updateExamStatistics(String examId);

    /**
     * 自动开始考试
     */
    void autoStartExams();

    /**
     * 自动结束考试
     */
    void autoEndExams();

    /**
     * 获取用户创建的考试列表
     * 
     * @param creatorId 创建者ID
     * @return 考试列表
     */
    List<ExamVO> getUserCreatedExams(String creatorId);

    /**
     * 批量删除考试
     * 
     * @param examIds 考试ID列表
     * @return 删除结果
     */
    boolean batchDeleteExams(List<String> examIds);
}
